/**
 * 表单数据转换工具函数
 * 用于处理表单编辑和提交时的数据格式转换
 */

/**
 * 编辑时：将关联对象转换为ID（用于表单初始值）
 * @param data 原始数据
 * @param relationFields 关联字段配置，如 { role: 'roleId', department: 'departmentId' }
 * @returns 转换后的数据
 */
export function transformEditData(data: any, relationFields?: Record<string, string>): any {
  if (!data) return data;
  
  const editData = { ...data };
  
  // 默认关联字段映射
  const defaultRelations: Record<string, string> = {
    role: 'roleId',
    department: 'departmentId',
    company: 'companyId',
    tenant: 'tenantId',
    plan: 'planId',
  };
  
  const relations = { ...defaultRelations, ...relationFields };
  
  // 处理单个关联对象
  Object.entries(relations).forEach(([objKey, idKey]) => {
    if (editData[objKey] && typeof editData[objKey] === 'object' && editData[objKey].id) {
      editData[idKey] = editData[objKey].id;
    }
  });
  
  // 处理多关联对象（如 roles -> roleIds）
  if (Array.isArray(editData.roles)) {
    editData.roleIds = editData.roles.map((r: any) => (typeof r === 'object' ? r.id : r));
  }
  if (Array.isArray(editData.permissions)) {
    editData.permissionIds = editData.permissions.map((p: any) => (typeof p === 'object' ? p.id : p));
  }
  
  return editData;
}

/**
 * 提交时：清理不需要的字段（用于表单提交）
 * @param data 表单数据
 * @param excludeFields 需要排除的额外字段
 * @returns 清理后的数据
 */
export function transformSubmitData(data: any, excludeFields?: string[]): any {
  if (!data) return data;
  
  const formData = { ...data };
  
  // 默认要删除的只读字段
  const defaultExcludeFields = [
    // 时间戳字段
    'createdAt', 'updatedAt', 'deletedAt',
    'created_at', 'updated_at', 'deleted_at',
    'createdBy', 'updatedBy', 'deletedBy',
    'created_by', 'updated_by', 'deleted_by',
    // 登录信息
    'lastLoginAt', 'lastLoginIp',
    'last_login_at', 'last_login_ip',
    // 关联对象（只保留ID字段）
    'role', 'roles', 'department', 'company', 'tenant', 'plan',
    'permissions', 'menus',
  ];
  
  const fieldsToRemove = [...defaultExcludeFields, ...(excludeFields || [])];
  
  // 删除指定字段
  fieldsToRemove.forEach(field => {
    delete formData[field];
  });
  
  return formData;
}

/**
 * 组合转换：同时处理编辑和提交的转换
 * @param mode 'edit' | 'submit'
 * @param data 数据
 * @param options 配置选项
 * @returns 转换后的数据
 */
export function transformFormData(
  mode: 'edit' | 'submit',
  data: any,
  options?: {
    relationFields?: Record<string, string>;
    excludeFields?: string[];
  }
): any {
  if (mode === 'edit') {
    return transformEditData(data, options?.relationFields);
  } else {
    return transformSubmitData(data, options?.excludeFields);
  }
}

